package aplicacion.modelo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Formatter;
import java.util.List;
import javax.swing.JOptionPane;

public class PuntajeMaximo{		
	
	private List<TipoPuntaje> listaPuntajeMaximo = new ArrayList<TipoPuntaje>();
	private Persistidor persistidor= new Persistidor();
	private static final long serialVersionUID = 1L;	
	private static PuntajeMaximo PUNTAJEMAXIMO = null;    
    
    public static PuntajeMaximo getInstance() {
            if(PUNTAJEMAXIMO == null) {
                    PUNTAJEMAXIMO = new PuntajeMaximo();
            }
            return PUNTAJEMAXIMO;
    }    
   
	public List<TipoPuntaje> getListaPuntajeMaximo(){
    	return this.listaPuntajeMaximo;
    }
    
    private PuntajeMaximo(){
    	this.cargar();
    	try{
        	this.restaurarPuntaje();
        }catch (Exception e){
        	this.persistir();
        }   
    }
	
	public void persistir(){
		persistidor.serializarPuntaje(listaPuntajeMaximo);		
	}
	
	private void restaurarPuntaje() throws IOException{
		this.listaPuntajeMaximo=persistidor.deserializarPuntaje();
	}		
	
	private void cargar(){
		TipoPuntaje puntaje= new TipoPuntaje(40000,"LGB");
		listaPuntajeMaximo.add(puntaje);
		puntaje= new TipoPuntaje(30000,"MAG");
		listaPuntajeMaximo.add(puntaje);
		puntaje= new TipoPuntaje(10000,"TMO");
		listaPuntajeMaximo.add(puntaje);
		puntaje= new TipoPuntaje(8500,"ITL");
		listaPuntajeMaximo.add(puntaje);
		puntaje= new TipoPuntaje(8000,"YMS");
		listaPuntajeMaximo.add(puntaje);		
		puntaje= new TipoPuntaje(7500,"JGH");
		listaPuntajeMaximo.add(puntaje);
		puntaje= new TipoPuntaje(7000,"POL");
		listaPuntajeMaximo.add(puntaje);
		puntaje= new TipoPuntaje(6500,"AEJ");
		listaPuntajeMaximo.add(puntaje);
		puntaje= new TipoPuntaje(500,"CPO");
		listaPuntajeMaximo.add(puntaje);
		puntaje= new TipoPuntaje(100,"AAE");
		listaPuntajeMaximo.add(puntaje);					
	}
		
	public int buscarPosicion(int puntos){
		TipoPuntaje aux=null;
		int indice=0;
		aux=listaPuntajeMaximo.get(indice);		
		while ((indice<listaPuntajeMaximo.size()) && (puntos<=aux.getPuntos())){
			indice++;
			if (indice<10)
				aux= listaPuntajeMaximo.get(indice);
		}	
		return indice;
	}
	
	public void agregar(int puntos,String nombre){
		TipoPuntaje puntaje=new TipoPuntaje (puntos,nombre);
		int posicion;
		posicion=this.buscarPosicion(puntos);		
		listaPuntajeMaximo.add(posicion, puntaje);
		listaPuntajeMaximo.remove(listaPuntajeMaximo.size()-1);
		Collections.sort(listaPuntajeMaximo);		
	}
	
	public String getCadena(){
		String cadena = new String("Posicion      Puntaje      Nombre\n");
		for(int i=0; (i<listaPuntajeMaximo.size());i++){
			Formatter fmt = new Formatter();
			fmt.format("%02d",(i+1));
			cadena=cadena + ("     "+fmt+ "            "+ (listaPuntajeMaximo.get(i)).toString()+"\n").toUpperCase();
		}
		return cadena;		
	}
	
	public String getNombrePuntajeMaximo(){
		String str = JOptionPane.showInputDialog(null, "Ingrese su Nombre : ", "Top Ten", -1);
		int puntajeDelJuego=Juego.getInstance().getPuntaje().getPuntaje();
		int PosicionEnTablaDePuntaje=PuntajeMaximo.getInstance().buscarPosicion(puntajeDelJuego);
		if(str != null)
			JOptionPane.showMessageDialog(null,str + ": Su puntaje es " + puntajeDelJuego
					+ ", usted ha quedado en la posicion " +(PosicionEnTablaDePuntaje+1), "Top Ten", -1);
		else
			str="";
		return str;
	}
	
}
